package com.clothing.customization.repository;

import com.clothing.customization.entity.ClothingStyle;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 服装款式Repository
 */
@Repository
public interface ClothingStyleRepository extends JpaRepository<ClothingStyle, Long> {
    
    /**
     * 根据状态查询服装款式列表，按创建时间倒序排序
     * @param status 状态
     * @return 款式列表
     */
    List<ClothingStyle> findByStatusOrderByCreateTimeDesc(Integer status);
    
    /**
     * 根据名称模糊查询服装款式列表
     * @param name 名称关键字
     * @param status 状态
     * @return 款式列表
     */
    List<ClothingStyle> findByNameContainingAndStatus(String name, Integer status);
    
    /**
     * 按条件分页查询
     * @param name 款式名称
     * @param categoryId 分类ID
     * @param status 状态
     * @param pageable 分页参数
     * @return 分页结果
     */
    @Query("SELECT s FROM ClothingStyle s WHERE " +
           "(:name IS NULL OR s.name LIKE %:name%) AND " +
           "(:categoryId IS NULL OR s.categoryId = :categoryId) AND " +
           "(:status IS NULL OR s.status = :status)")
    Page<ClothingStyle> findByConditions(
            @Param("name") String name,
            @Param("categoryId") Integer categoryId,
            @Param("status") Integer status,
            Pageable pageable
    );
    
    /**
     * 更新款式状态
     * @param id 款式ID
     * @param status 状态
     * @return 影响行数
     */
    @Modifying
    @Query("UPDATE ClothingStyle s SET s.status = :status WHERE s.id = :id")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);
    
    /**
     * 检查名称是否存在
     * @param name 款式名称
     * @param id 排除的ID
     * @return 是否存在
     */
    @Query("SELECT COUNT(s) > 0 FROM ClothingStyle s WHERE s.name = :name AND (:id IS NULL OR s.id != :id)")
    boolean existsByNameAndIdNot(@Param("name") String name, @Param("id") Long id);
} 